import utime
'''
发送数据格式：
        左右轮编码器值(左右轮), imu数据(元组)
          (现有数据)          (现有数据)
    示例：
        ((enc_A,enc_B),(AcX,AcY,AcZ,GyX,GyY,GyZ))
接收数据格式：
        左右轮PWM值
    示例:
        (pwm_A, pwm_B)
'''
class Serial:
    def __init__(self, uart):
        self.uart = uart

    def serial_check(self, ser_data):
        '''
        函数功能：检查串口是否接受到数据
        '''
        if ser_data != None:
            return True
        else:
            return False

    def send_data(self, data="hi i'm pyboard!\n"):
        '''
        函数功能：串口发送数据
        入口参数：需要发送的打包好的数据（字符串格式）
        '''
        self.uart.write(data)
        # print(data)

    def format_data(self,encoders=(0,0), imu=(0,0,0)):
        '''
        函数功能：将需要发送的所有数据封装起来
        入口参数：所有需要发送的数据
        返回值  ：封装后的数据元组
        '''
        data = (encoders, imu)
        zip_data = (str(data) + "\n").encode("utf-8") #  
        # print(zip_data)
        return zip_data
    

    def rev_data(self):
        '''
        函数功能：读取上位机发送的运动控制指令
        入口参数：无
        返回值  ：接收到的数据（已经被转化为可读取的元组形式）
        '''
        start = utime.ticks_ms()
        data = self.uart.readline()
        if data != None:
            try:
                data = self.analysis_data(data)
            except:
                pass
            # print(data)
        end = utime.ticks_ms()
        # print("serial running time:", end - start)
        return data

    def analysis_data(self, data):
        '''
        函数功能：解析串口数据并返回解析完成的元组数据
        入口参数：串口直接接受的数据
        返回值  ：解析后的元组数据
        '''
        data.decode("utf-8")
        data = str(data)[2:-3] # 将 “\n” 和 b'' 去除
        data = eval(data) # 转化回元组形式
        print(type(data))
        return data
